package aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author 黄军艳
 * @version 1.0
 * @date 2024/12/2  15:20
 */
public class TimeSpanAspect {
    private static final Logger log= LoggerFactory.getLogger(TimeSpanAspect.class);
    /**
     * 环绕增强
     */
    public Object around(ProceedingJoinPoint jp) throws Throwable{
        log.info("【环绕增强-前置】记录{}方法执行的开始时间.",jp.getSignature().getName());
        //进入方法之前就记录开始时间
        long startTime=System.currentTimeMillis();
        try {
            //通过proceed()方法可以执行目标方法
            Object result=jp.proceed();
            log.info("【环绕增强-后置】{}方法执行结果为{}.",jp.getSignature().getName(),result);
            //注意：环绕增强要将结果返回
            return result;
        }catch (Throwable e){
            log.info("【环绕增强-异常抛出】{}方法执行异常信息为{}.",jp.getSignature().getName(),e.getMessage());
            //注意：不能隐藏异常，需要抛出
            throw e;
        }finally {
            //在finally中记录结束时间，保证不管正常还是异常都能记录执行时间
            long endTime=System.currentTimeMillis();
            log.info("【环绕增强-最终】记录{}方法执行的结束时间，并计算耗时为{}ms.",jp.getSignature().getName(),(endTime-startTime));
        }
    }
}
